Add functionality to set overall opacity of a top-level window. (#405316)
authorTor Lillqvist <tml@novell.com>
Mon, 30 Apr 2007 07:27:22 +0000 (07:27 +0000)
committerTor Lillqvist <tml@src.gnome.org>
Mon, 30 Apr 2007 07:27:22 +0000 (07:27 +0000)
2007-04-30  Tor Lillqvist  <tml@novell.com>

Add functionality to set overall opacity of a top-level
window. (#405316)

* gdk/gdk.symbols: Add gdk_window_set_opacity.

* gdk/x11/gdkwindow-x11.c
* gdk/win32/gdkwindow-win32.c: Implement
gdk_window_set_opacity(). On X11 use the _NET_WM_WINDOW_OPACITY
property. On Win32 use SetLayeredWindowAttributes(LWA_ALPHA).

* gdk/gdkwindow.h: Declare gdk_window_set_opacity().

* gdk/x11/gdkscreen-x11.c (gdk_screen_get_rgba_colormap): Document
that this is not implemented in the Windows backend. Add reference
to gdk_window_set_opacity().

svn path=/trunk/; revision=17730

ChangeLog
gdk/gdk.symbols
gdk/gdkwindow.h
gdk/win32/gdkwindow-win32.c
gdk/x11/gdkscreen-x11.c
gdk/x11/gdkwindow-x11.c

index c14d83abbc71a8021685ff1e1f65530d0e470b06..3557d84ac18db31ba35adb401c10003673393487 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2007-04-30  Tor Lillqvist  <tml@novell.com>
+
+       Add functionality to set overall opacity of a top-level
+       window. (#405316)
+
+       * gdk/gdk.symbols: Add gdk_window_set_opacity.
+
+       * gdk/x11/gdkwindow-x11.c
+       * gdk/win32/gdkwindow-win32.c: Implement
+       gdk_window_set_opacity(). On X11 use the _NET_WM_WINDOW_OPACITY
+       property. On Win32 use SetLayeredWindowAttributes(LWA_ALPHA).
+
+       * gdk/gdkwindow.h: Declare gdk_window_set_opacity().
+
+       * gdk/x11/gdkscreen-x11.c (gdk_screen_get_rgba_colormap): Document
+       that this is not implemented in the Windows backend. Add reference
+       to gdk_window_set_opacity().
+
 2007-04-30  Matthias Clasen <mclasen@redhat.com>
 
        * gtk/gtk.symbols:
index b064cc7f50f67b8963e64179554bbcd33ca902f2..ae345865414a6fcaeee66b29083da6837583e213 100644 (file)
@@ -740,6 +740,7 @@ gdk_window_set_icon_list
 gdk_window_set_icon
 gdk_window_set_icon_name
 gdk_window_beep
+gdk_window_set_opacity
 gdk_window_iconify
 gdk_window_deiconify
 gdk_window_stick
index 325c4b3d88ea45d2ba74f083cc42d61c01227310..9ff3a09fca0622c06fef28336d128f1ccf29a496 100644 (file)
@@ -569,7 +569,8 @@ void          gdk_window_set_keep_above  (GdkWindow       *window,
                                           gboolean         setting);
 void          gdk_window_set_keep_below  (GdkWindow       *window,
                                           gboolean         setting);
-
+void          gdk_window_set_opacity     (GdkWindow       *window,
+                                          gdouble          opacity);
 void          gdk_window_register_dnd    (GdkWindow       *window);
 
 void gdk_window_begin_resize_drag (GdkWindow     *window,
index 9d029619ab37496013cac71b600505af74cf21d5..75d944d2d786915124ea812ecc94c44c0f7da6f8 100644 (file)
@@ -3399,3 +3399,33 @@ gdk_window_beep (GdkWindow *window)
 {
   gdk_display_beep (_gdk_display);
 }
+
+void
+gdk_window_set_opacity (GdkWindow *window,
+                       gdouble    opacity)
+{
+  LONG exstyle;
+
+  g_return_if_fail (GDK_IS_WINDOW (window));
+  g_return_if_fail (WINDOW_IS_TOPLEVEL (window));
+
+  if (GDK_WINDOW_DESTROYED (window))
+    return;
+
+  if (opacity < 0)
+    opacity = 0;
+  else if (opacity > 1)
+    opacity = 1;
+
+  exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
+
+  if (!(exstyle & WS_EX_LAYERED))
+    API_CALL (SetWindowLong, (GDK_WINDOW_HWND (window),
+                             GWL_EXSTYLE,
+                             exstyle | WS_EX_LAYERED));
+
+  API_CALL (SetLayeredWindowAttributes, (GDK_WINDOW_HWND (window),
+                                        0,
+                                        opacity * 0xff,
+                                        LWA_ALPHA));
+}
index f5e08d87ae41f52b74b300ced53fe16aaa2d3eae..624870f850f2e84c42b945ac90c36cea7788c5ea 100644 (file)
@@ -382,7 +382,12 @@ gdk_screen_get_monitor_geometry (GdkScreen    *screen,
  * when displaying the window on the screen: in particular, for
  * X an appropriate windowing manager and compositing manager
  * must be running to provide appropriate display.
- * 
+ *
+ * This functionality is not implemented in the Windows backend.
+ *
+ * For setting an overall opacity for a top-level window, see
+ * gdk_window_set_opacity().
+
  * Return value: a colormap to use for windows with an alpha channel
  *   or %NULL if the capability is not available.
  *
index fe5a0976f38a72ee2f9aac2965915a89285f8454..621d3245dd1da8e58ae4deaaeb040ffac030e8d5 100644 (file)
@@ -6402,5 +6402,54 @@ gdk_window_beep (GdkWindow *window)
     gdk_display_beep (display);
 }
 
+/**
+ * gdk_window_set_opacity:
+ * @window a top-level #GdkWindow
+ * @opacity: opacity
+ *
+ * Request the windowing system to make @window partially transparent,
+ * with opacity 0 being fully transparent and 1 fully opaque. (Values
+ * of the opacity parameter are clamped to the [0,1] range.) On X11
+ * this works only on X screens with a compositing manager running.
+ *
+ * For setting up per-pixel alpha, see gdk_screen_get_rgba_colormap().
+ *
+ * Since: 2.12
+ */
+void
+gdk_window_set_opacity (GdkWindow *window,
+                       gdouble    opacity)
+{
+  GdkDisplay *display;
+  guint32 cardinal;
+  
+  g_return_if_fail (GDK_IS_WINDOW (window));
+  g_return_if_fail (WINDOW_IS_TOPLEVEL (window));
+
+  if (GDK_WINDOW_DESTROYED (window))
+    return;
+
+  display = gdk_drawable_get_display (window);
+
+  if (opacity < 0)
+    opacity = 0;
+  else if (opacity > 1)
+    opacity = 1;
+
+  cardinal = opacity * 0xffffffff;
+
+  if (cardinal == 0xffffffff)
+    XDeleteProperty (GDK_DISPLAY_XDISPLAY (display),
+                    GDK_WINDOW_XID (window),
+                    gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_WINDOW_OPACITY"));
+  else
+    XChangeProperty (GDK_DISPLAY_XDISPLAY (display),
+                    GDK_WINDOW_XID (window),
+                    gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_WINDOW_OPACITY"),
+                    XA_CARDINAL, 32,
+                    PropModeReplace,
+                    (guchar *) cardinal, 1);
+}
+
 #define __GDK_WINDOW_X11_C__
 #include "gdkaliasdef.c"